package com.linzelin.controller;

import com.alibaba.fastjson.JSON;
import com.linzelin.utils.FileUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Controller;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;

@Controller
public class unloadController {
    @RequestMapping("/upload")
    public String fileUpload(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException, FileNotFoundException {
        /*//这里是通过方法参数获得了文件的二进制file对象
        String uploadFileName = file.getOriginalFilename();
        //获取文件名 : file.getOriginalFilename();

        if ("".equals(uploadFileName)){
            return "redirect:/index.jsp";
            //如果文件名为空，直接回到首页！
            //使用重定向直接定位回默认页面
        }
        System.out.println("上传文件名 : "+uploadFileName);

        String path = request.getServletContext().getRealPath("/upload");
        //上传路径保存设置
        File realPath = new File(path);
        if (!realPath.exists()){
            //如果路径不存在，创建一个
            realPath.mkdir();
        }
        System.out.println("上传文件保存地址："+realPath);
        //控制台输出文件的保存路径
        InputStream is = file.getInputStream();
        //文件输入流
        OutputStream os = new FileOutputStream(new File(realPath,uploadFileName));
        //文件输出流

        *//*读取写出*//*
        int len=0;
        byte[] buffer = new byte[1024];
        while ((len=is.read(buffer))!=-1){
            os.write(buffer,0,len);
            os.flush();
        }
        os.close();
        is.close();
        //关闭缓存*/
        String path = request.getServletContext().getRealPath("/upload");
        String uploadFileName = file.getOriginalFilename();
        new FileUtils().uploadFile(file, path);
        return "redirect:/index.jsp";
        //返回对应页面
    }


    /*
     * 采用file.Transto 来保存上传的文件
     */
    @RequestMapping("/upload2")
    public String fileUpload2(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {

        /*上传路径保存设置*/
        String path = request.getServletContext().getRealPath("/upload");
        File realPath = new File(path);
        if (!realPath.exists()) {
            realPath.mkdir();
        }

        System.out.println("上传文件保存地址：" + realPath);
        //控制台输出文件的保存地址

        file.transferTo(new File(realPath + "/" + file.getOriginalFilename()));
        //通过CommonsMultipartFile的方法直接写文件（注意这个时候）
        return "redirect:/index.jsp";
    }

    @RequestMapping(value = "/download")
    public String downloads(HttpServletResponse response, HttpServletRequest request) throws Exception {

        String path = request.getServletContext().getRealPath("/upload");
        //要下载的文件地址
        String fileName = "暑假培训安排.xlsx";
        //对应的具体文件名

        //1、设置response 响应头
        response.reset();
        //设置页面不缓存,清空buffer
        response.setCharacterEncoding("UTF-8");
        //字符编码
        response.setContentType("multipart/form-data");
        //二进制传输数据

        response.setHeader("Content-Disposition",
                "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8"));
        //设置响应头
        File file = new File(path, fileName);
        //2、 读取文件--输入流
        InputStream input = new FileInputStream(file);
        //3、 写出文件--输出流
        OutputStream out = response.getOutputStream();

        byte[] buff = new byte[1024];
        int index = 0;
        //4、执行 写出操作
        while ((index = input.read(buff)) != -1) {
            out.write(buff, 0, index);
            out.flush();
        }
        out.close();
        input.close();
        return "OK";
        //写出完成后跳转回对应页面
    }

    @RequestMapping("/importExcel")
    public String importExcel(MultipartFile file) throws Exception {
        // file为上传的后台接收到的前端文件，文件名称可访问，内容为字节数据需要转成POI专属的Workbook对象进行内容数据获取
        Assert.notNull(file, "上传文件不能为空");
        System.out.println(1);
        // 将输入的file文件转成POI的Excel文件对象Workbook
        String fileName = file.getOriginalFilename(); // 获取文件名
        Workbook workbook = null;
        if (StringUtils.endsWithIgnoreCase(fileName, "XLS")) {
            try {
                workbook = new HSSFWorkbook(file.getInputStream()); // XLS类型，2003Excel版本
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else if (StringUtils.endsWithIgnoreCase(fileName, "XLSX")) {
            try {
                workbook = new XSSFWorkbook(file.getInputStream()); // XLSX类型，2007Excel版本
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            System.out.println("文件类型不符,不是Excel文件 ");
        }
        System.out.println(2);
        // 解析Workbook对象，获取上传Excel内容（实际中，上传Excel文件需要按照指定规范编写上传）
        // 得到一个Sheet工作表
        Sheet sheet = workbook.getSheetAt(0);
        System.out.println("sheet:"+ JSON.toJSONString(sheet));
        // 获得Sheet工作表的数据总行数（第0行开始）
        int totalRowNum = sheet.getLastRowNum();
        System.out.println("总行数totalRowNum:"+totalRowNum);
        // 获取当前sheet的第一行
        Row row1 = sheet.getRow(0);
        System.out.println("row1:"+JSON.toJSONString(row1));
        // 获取当前sheet的第二行
        Row row2 = sheet.getRow(1);
        System.out.println("row2:"+JSON.toJSONString(row2));
        // 获取当前sheet的第二行总列数（第1列开始）
        int physicalNumberOfCells = row2.getPhysicalNumberOfCells();
        System.out.println("获得第二行的总列数physicalNumberOfCells:"+physicalNumberOfCells);
        // 获取第二行的第一个cell
        Cell cell = row2.getCell(0);
        System.out.println("第二行第一列cell:"+cell);
        // 获取cell的数据类型
        int cellType = cell.getCellType();
        System.out.println("cellType:"+JSON.toJSONString(cellType));
        // 获取cell的数据，需要根据类型选择调用以下的方法
        // cell类型为String，获取内容
        String stringCellValue = cell.getStringCellValue();
        System.out.println("stringCellValue:"+JSON.toJSONString(stringCellValue));
        // cell类型为数字，获取内容
//		double numericCellValue = cell.getNumericCellValue();
        // cell类型为布尔型，获取内容
//		boolean booleanCellValue = cell.getBooleanCellValue();
        return "OK";
    }
}
